package com.dh.leetcode.two;

import org.junit.Assert;
import org.junit.Test;

/**
 * @ClassName: _223_rectangle_area
 * @Description: 223. 矩形面积
 * 在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积。
 * <p>
 * 每个矩形由其左下顶点和右上顶点坐标表示，如图所示。
 * <p>
 * Rectangle Area
 * <p>
 * 示例:
 * <p>
 * 输入: -3, 0, 3, 4, 0, -1, 9, 2
 * 输出: 45
 * 说明: 假设矩形面积不会超出 int 的范围。
 * <p>
 * https://leetcode-cn.com/problems/rectangle-area/
 * @Author: shouzimu
 * @Date: 2021/1/21 16:37
 */
public class _223_rectangle_area {

    /**
     *
     * 两个矩形面积分别相加-重叠部分面积
     *
     * 判断是否重叠为判断两个线段是否有交叉点
     *
     * 第一版判断重叠部分不对，导致解答错误
     *
     * 左坐标 矩形A和矩形B左边较大的坐标
     * 右坐标 矩形A和矩形B右边较小的坐标
     * 上下坐标同理
     *
     *
     * @param A
     * @param B
     * @param C
     * @param D
     * @param E
     * @param F
     * @param G
     * @param H
     * @return
     */
    public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
        int ax = C - A;
        int ay = D - B;
        int bx = G - E;
        int by = H - F;
        int area = 0;
        //判断矩形a b是否相交
        boolean xIntersect = !(E >= C) && !(G <= A);
        boolean yIntersect = !(F >= D) && !(H <= B);
        if (xIntersect && yIntersect) {
            int aL = Math.max(A, E);
            int aR = Math.min(C, G);

            int bL = Math.max(B, F);
            int bR = Math.min(D, H);
            area -= Math.abs(aR - aL) * Math.abs(bR - bL);
        }
        area += ax * ay + bx * by;
        return area;
    }


    @Test
    public void computeAreaTest() {
        Assert.assertEquals(24, computeArea(-2, -2, 2, 2, -3, -3, 3, -1));
        Assert.assertEquals(16, computeArea(-2, -2, 2, 2, -1, -1, 1, 1));
        Assert.assertEquals(45, computeArea(-3, 0, 3, 4, 0, -1, 9, 2));
    }
}
